home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / MacHaskell 2.2 / progs / lib / hbc / Random.hs < prev    next >
Encoding:
Text File  |  1994-09-27  |  1.6 KB  |  41 lines  |  [TEXT/YHS2]

  1. e
  2. -- an infinite list of random Ints.
  3. randomInts :: Int -> Int -> [Int]
  4. randomInts s1 s2 =
  5.     if 1 <= s1 && s1 <= 2147483562 then
  6.     if 1 <= s2 && s2 <= 2147483398 then
  7.         rands s1 s2
  8.     else
  9.         error "randomInts: Bad second seed."
  10.     else
  11.     error "randomInts: Bad first seed."
  12.  
  13. rands :: Int -> Int -> [Int]
  14. rands s1 s2 =
  15.     let
  16.     k    = s1 `div` 53668
  17.     s1'  = 40014 * (s1 - k * 53668) - k * 12211
  18.     s1'' = if s1' < 0 then s1' + 2147483563 else s1'
  19.     
  20.     k'   = s2 `div` 52774
  21.     s2'  = 40692 * (s2 - k' * 52774) - k' * 3791
  22.     s2'' = if s2' < 0 then s2' + 2147483399 else s2'
  23.  
  24.     z    = s1'' - s2''
  25. {-
  26.     z'   = if z < 1 then z + 2147483562 else z
  27.  
  28.     in  z' : rands s1'' s2''
  29. -}
  30. -- Use this instead; it is a little stricter and generates much better code
  31.     in  if z < 1 then z + 2147483562 : rands s1'' s2'' 
  32.                  else z : rands s1'' s2''
  33.  
  34. -- For those of you who don't have fromInt
  35. fromInt = fromInteger . toInteger
  36.  
  37. -- Same values for s1 and s2 as above, generates an infinite
  38. -- list of Doubles uniformly distibuted in (0,1).
  39. randomDoubles :: Int -> Int -> [Double]
  40. randomDoubles s1 s2 = map (\x -> fromInt x * 4.6566130638969828e-10) (randomInts s1 s2)
  41.